<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>模式（Patterns）和修饰符（flags）</title>
	</head>
	<body>
		<!--
		正在表达式是提供了一种 在文本中进行搜索和替换 的强大的方式的模式。
		在 JS 中，我们可以通过 RegExp 对象使用它们，也可以与字符串结合使用。
		 -->

		<!--
		 正则表达式由模式和可选择修饰符(6个):

		 i 搜索时忽略大小写。
		 g 全文搜索（没有 g 时只匹配第一个）。
		 m 多行匹配。
		 s 允许 . 匹配换行符\n。
		 u 开启完整的 Unicode 支持。该修饰符能够正确处理代理对。
		 y 在匹配时使用最后一次匹配的字符串。
		-->

		<script>
			// 正则表达式由 模式 和 可选的修饰符 组成。两种创建正则表达式对象的语法：

			// 1. 较长一点的语法（动态写法）
			// let regxp1 = new RegExp('pattern', 'flags')

			// 2. 较短的一点的语法，使用斜线 "/"（静态写法）
			// let regxp2 = /pattern/ // 没有修饰符
			// let regxp3 = /pattern/gim // 带有修饰符 g、m 和 i
		</script>

		<script>
			//  斜线 /.../ 告诉 JS 我们正在创建一个正则表达式。它的作用与字符串的引号作用相同。使用斜线 /.../ 的模式不允许插入表达式（例如带有 ${...} 的字符串模版）。它完全静态的。
		</script>

		<script>
			// 【结合字符串方法使用】
			let str = 'We will, we will rock you'
			// g 全文搜索（没有 g 时只匹配第一个），i 忽略大小写
			console.log(str.match(/we/gi)) // ['We', 'we'] 没匹配到返回null

			// 【替换：str.replace】
			let str1 = 'We will, we will'.replace(/we/i, 'I')
			console.log(str1) // I will, we will

			let str2 = 'We will, we will'.replace(/we/gi, 'I')
			console.log(str2) // I will, I will

			// 【	在替换字符串中的行为】
			let str3 = 'I love HTML'.replace(/html/i, '$& and JavaScript')
			console.log(str3) // I love HTML and JavaScript
			// let str3 = 'I love HTML'.replace(/html/i, '$` and JavaScript')
			// console.log(str3) // I love I love  and JavaScript
			// let str3 = 'I love HTML'.replace(/html/i, "$' and JavaScript")
			// console.log(str3) // I love  and JavaScript
			// let str3 = 'I love HTML'.replace(/html/i, '$1 and JavaScript')
			// console.log(str3) // I love  and JavaScript
		</script>

		<script>
			// 测试：regexp.test
			let str4 = 'I love HTML'
			let regexp = /LOVE/i

			// 根据正则表达式的规则，如果字符串与正则表达式匹配，则返回 true，否则返回 false。
			console.log(regexp.test(str4)) // true
		</script>
	</body>
</html>
